﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "IUnCommandControlDefinition.h"

namespace gcmp
{
class IRadioButtonGroupHandler;
enum class CheckState;
class IControlState;
class IRadioButtonGroupEvent;

/// \brief RadioButton控件数据定义接口
class IRadioButtonDefinition : public IUnCommandControlDefinition
{
};

/// \brief RadioButtonGroup数据定义接口
class GCMP_GUI_BASE_INTERFACE_EXPORT IRadioButtonGroupDefinition : public IUnCommandControlDefinition
{
public:
    /// \brief 创建IRadioButtonGroupDefinition对象
    ///
    /// \param id       IRadioButtonGroupDefinition的id,需保证唯一性
    /// \param caption    RadioButtonGroup控件标题
    /// \return  创建出IRadioButtonGroupDefinition对象。失败时返回空
    static OwnerPtr<IRadioButtonGroupDefinition> Create(const std::wstring& id, const std::wstring& caption);

    /// \brief 创建pRadioButtonGroupDefinition的引用
    ///
    /// pRadioButtonGroupDefinition需加到IControlDefinitionLibrary时才能创建引用对象；不能通过引用创建引用 
    /// \param pRadioButtonGroupDefinition   IRadioButtonGroupDefinition对象
    /// \return  创建出IRadioButtonGroupDefinition对象。失败时返回空
    static OwnerPtr<IRadioButtonGroupDefinition> CreateReference(const IRadioButtonGroupDefinition* pRadioButtonGroupDefinition);

    /// \brief 添加RadioButton至最后
    ///
    /// \param id    RadioButton的id,在该RadioButtonGroup需保证唯一性
    /// \param caption    控件标题
    /// \param tooltip    控件的提示信息
    /// \return   true表示成功，如果RadioButtonGroup已有Id为id的RadioButton,则返回false
    virtual bool AddRadioButton(const std::wstring& id, const std::wstring& caption, const std::wstring& tooltip) = 0;

    /// \brief 插入RadioButton
    ///
    /// \param beforeId  被插入对象的id
    /// \param id    将插入RadioButton的id,在该RadioButtonGroup需保证唯一性
    /// \param caption    将插入的控件标题
    /// \param tooltip    将插入的控件的提示信息
    /// \return   true表示成功， 如果RadioButtonGroup不包含Id为beforeId的RadioButton会已包含Id为id的RadioButton,则返回false
    virtual bool InsertRadioButton(const std::wstring& beforeId, const std::wstring& id, const std::wstring& caption, const std::wstring& tooltip) = 0;

    /// \brief 删除RadioButton
    ///
    /// \param id    将删除对象的id
    /// \return  true表示成功，如果RadioButtonGroup不包含Id为id的RadioButton,则返回false
    virtual bool DeleteRadioButton(const std::wstring& id) = 0;

    /// \brief 删除所有RadioButton
    virtual void DeleteAllRadioButtons() = 0;

    /// \brief 得到所有的RadioButton
    ///
    /// \return  RadioButton集合
    virtual std::vector<const IRadioButtonDefinition*> GetAllRadioButtons() const = 0;

    /// \brief 得到当前被选中的RadioButton对象的id
    virtual std::wstring GetCurrentRadioButton() const = 0;

    /// \brief 设置被选中的RadioButton
    ///
    /// \param id       RadioButton的id
    /// \return  true表示成功，如果RadioButtonGroup不包含Id为id的RadioButton,则返回false
    virtual bool SetCurrentRadioButton(const std::wstring& id) = 0;

    /// \brief 设置RadioButton的可见及可用状态以及执行函数
    ///
    /// \param pControlHandler RadioButtonGroup控件处理者
    /// \return     true表示成功，false表示失败
    virtual bool SetControlHandler(OwnerPtr<IRadioButtonGroupHandler> pControlHandler) = 0;


    //////////////////////////////////////////////////////////////////////////////////////////////
    /// \brief 设置RadioButton的可用性 （相关代码会调整，请勿使用）
    ///
    /// 通过SetControlState设置后，SetEnabled将不起作用
    /// \param id   将设置RadioButton的状态的Id
    /// \param enabled true代表设置可用，false代表设置不可用
    /// \return     true表示成功， 如果RadioButtonGroup不包含Id为id的RadioButton,则返回false
    virtual bool SetEnabled(const std::wstring& id, bool enabled) = 0;

    /// \brief 设置RadioButton的可见性（相关代码会调整，请勿使用）
    ///
    /// 通过SetControlState设置后，SetVisible将不起作用
    /// \param id   将设置RadioButton的状态的Id
    /// \param visible true代表设置可见，false代表设置不可见
    /// \return     true表示成功， 如果RadioButtonGroup不包含Id为id的RadioButton,则返回false
    virtual bool SetVisible(const std::wstring& id, bool visible) = 0;

    /// \brief 得到IRadioButtonGroupEvent对象 （相关代码会调整，请勿使用）
    ///
    /// \return IRadioButtonGroupEvent对象
    virtual IRadioButtonGroupEvent* GetEvent() const = 0;
};

}   // end namespace gcmp
